Приложение 6. Вспомогательные Интернет-сервисы администрирования

6.1. Интернет-сервис получения списка общих информационных баз

6.1.1. Общая информация

Примечание. Доступно только для лицензии КОРП. Подробнее о видах лицензий см. здесь.

При удаленной работе (например, через веб-сервер) возникает необходимость получения списка общих информационных баз. В этом случае параметр CommonInfoBases конфигурационного файла 1cestart.cfg не позволяет получить этот список. Для получения этого списка можно воспользоваться возможностью публикации списка общих информационных баз через Интернет-сервис. При этом доступно получение списка как через HTTP-запросы и через Web-сервисы.

Если получение списка общих информационных баз выполняется с помощью HTTPS-соединения, то проверка сертификата сервера (с которого выполняется получение списка) выполняется с помощью сертификатов корневых удостоверяющих центров, получаемых из системного хранилища соответствующей ОС.

6.1.2. Получение через Web-сервис

Для получения списка общих информационных баз через Web-сервис необходимо опубликовать специальный Web-сервис, который будет возвращать этот список. Рассмотрим работу этого Web-сервиса более подробно.

6.1.2.1. Описание функционирования

Интерактивная программа запуска (1cv8s) может получить список общих баз, как из локальной сети, так и через Интернет. Получение списка баз через Интернет выполняется только в случае интерактивного запуска и если указан адрес для получения списка общих информационных баз (параметр InternetService или WebCommonInfoBases файла 1cestart.cfg).

Для нормального функционирования, механизм получения списка общих информационных баз должен удовлетворять следующим требованиям:

● Вызов метода WebCommonInfoBases.CheckInfoBases() должен быть анонимным;

● Вызов метода WebCommonInfoBases.GetInfoBases() должен выполнять с аутентификацией;

● Информационная база, которая возвращает списки общих баз, должна содержать список пользователей, которые могут обращаться к ней за списком баз.

Первым шагом осуществляется вызов метода WebCommonInfoBases.CheckInfoBases() (анонимно). Если для этого компьютера и для этого пользователя интерактивная программа запуска вызывается впервые, то в качестве параметров ClientID и InfoBasesCheckCode передается значение 00000000-0000-0000-0000-000000000000. Если вызов не первый, то в качестве параметров передаются код клиента и код, идентифицирующий текущий список общих информационных баз. Метод Web-сервиса должен определить, нужно обновлять список общих информационных баз для данного клиента или нет. Если такая необходимость есть, то выходной параметр InfoBasesChanged должен получить значение Истина, а параметр URL должен содержать адрес Web-сервиса, в котором реализован метод WebCommonInfoBases.GetInfoBases() (требует аутентификации). В противном случае параметр InfoBasesChanged должен получить значение Ложь, а параметр URL должен содержать пустую строку.

Алгоритм, используемый для проверки неизменности списка общих информационных баз, не регламентируется и может быть произвольным. Необходимо понимать, что интерактивная программа запуска не занимается расчетом значения кода, идентифицирующего список общих информационных баз, а просто хранит значение, которое было передано при предыдущем вызове Web-сервиса.

Если вызов метода WebCommonInfoBases.CheckInfoBases() указал на необходимость обновления списка, интерактивная программа запуска вызывает метод Web-сервиса WebCommonInfoBases.GetInfoBases(). Web-сервис расположен по адресу, который вернула функция WebCommonInfoBases.CheckInfoBases() в параметре URL. Метод GetInfoBases() должен сопоставить пользователя, от имени которого выполнена аутентификация Web-сервиса с каким-либо кодом клиента. Сопоставление может быть «персональным» ‑ пользователь идентифицирует себя своим персональным именем пользователя и паролем и получает свой, персональный список общих информационных баз. Также сопоставление может быть «ролевым» ‑ пользователь идентифицирует свою принадлежность к некоторой роли, например Оператор, Кладовщик и т. д., и получает список общих информационных баз, который общий для всех пользователей, выполняющих одну роль. При этом необходимо понимать, что в первом случае информационная база, реализующая метод GetInfoBases(), должна содержать список всех пользователей, которые могут запускать интерактивную программу запуска (1cv8s), подключенную в Web-сервису. Во втором случае в списке пользователей достаточно завести имена ролей.

Метод GetInfoBases() должен вернуть три значения:

● Код клиента (если он не задан);

● Список общих информационных баз в формате v8i (см. здесь);

● Значение кода, идентифицирующий переданный список общих информационных баз. Это значение будет передано в метод WebCommonInfoBases.CheckInfoBases() при следующей проверке необходимости обновления списка общих информационных баз.

Если список общих информационных баз получается впервые, то код клиента (параметр ClientID) будет равно значению 00000000-0000-0000-0000-000000000000.

Также следует понимать следующие особенности:

● Информационная база, в которой реализуется Web-сервис WebCommonInfoBases, должна публиковаться в две разные публикации ‑ это вытекает из необходимости обеспечить разный уровень аутентификации для вызова метода CheckInfoBases() и GetInfoBases().

● Организация анонимного доступа выполняется с помощью явного указания пользователя, от имени которого выполняется доступ, в файл default.vrd.

● Пользователь, от имени которого организуется анонимный доступ, не должен иметь возможность вызывать метод получения списка информационных баз, а только указывать, изменился список для переданного значения ClientID или нет.

● Ни одна публикация, обслуживающая Web-сервис WebCommonInfoBases, не должна предоставлять возможность работать с помощью веб-клиента.

● Если список общих информационных баз используется мобильным клиентом, то в таком файле должны присутствовать корректные значения параметра MobilePublicKey для тех информационных баз, которые должны отображаться в мобильном клиенте.

6.1.2.2. Описание Web-сервиса

Имя Web-сервиса: WebCommonInfoBases. Тайм-аут на выполнение любого метода Web-сервиса составляет 3 секунды.

Методы Web-сервиса перечислены ниже.

CheckInfoBases

Описание:

Данный метод используется интерактивной программой запуска (1cv8s) для определения необходимости получения списка общих информационных баз.

Параметры:

ClientID                                   входной

Тип: Строка. Содержит идентификатор клиента, для которого проверяется актуальность списка общих информационных баз.

InfoBasesCheckCode                         входной

Тип: Строка. Код, идентифицирующий список информационных баз. Код должен однозначно идентифицировать текущий список информационных баз. При любом изменении списка код должен быть изменен и не должен совпадать ни с одним, ранее используемым для данного идентификатора клиента, кодом.

InfoBasesChanged                          выходной

Тип: Булево. Признак того, что список общих информационных баз необходимо получить повторно.

URL                                       выходной

Тип: Строка. URL, по которому следует запрашивать список общих информационных баз в том случае, если этот список поменялся с прошлого обращения.

Возвращаемое значение:

Тип произвольный, значение игнорируется.

GetInfoBases

Описание:

Параметры:

ClientID                          входной/выходной

Тип: Строка. Содержит идентификатор клиента, для которого выполняется получение списка общих информационных баз. Если идентификатор клиента не задан (равен значению 00000000-0000-0000-0000-000000000000), то метод должен назначить идентификатор клиента и вернуть его в этом параметре.

InfoBasesCheckCode                        выходной

Тип: Строка. Значение кода, идентифицирующего список общих информационных баз, который возвращается данным методом в параметре InfoBases.

InfoBases                                 выходной

Тип: Строка. Список общих информационных баз в формате v8i (см. здесь).

Возвращаемое значение:

Тип произвольный, значение игнорируется.

6.1.2.3. Пример реализации

Рассмотрим пример Web-сервиса для получения списка общих информационных баз.

Примечание. Пример, приведенный в данном разделе, не является законченным. Он предназначен для демонстрации работы механизма.

В качестве Web-сервиса используется простая конфигурация, которая содержит один справочник и один Web-сервис.

Справочник имеет следующие характеристики:

● Имя СписокОбщихБаз.

● Тип кода Строка, длина 36 символов.

● Реквизиты:

● Имя КодСписка, тип УникальныйИдентификатор.

● Имя СписокИБ, тип Строка, неограниченной длины.

● Остальные параметры заданы по умолчанию.

Данный справочник будет хранить список идентификаторов клиентов (стандартный реквизит Код), список общих информационных баз (реквизит СписокИБ) и текущая версия списка информационных баз (реквизит КодСписка), рассчитанной при последнем получении списка для данного клиента. Версия списка является уникальным идентификатором, который изменяется при каждом сохранении элемента справочника. Для этого в модуле объекта определен обработчик ПередЗаписью:

Копировать в буфер обмена
Процедура ПередЗаписью(Отказ)
    КодСписка = Новый УникальныйИдентификатор;
КонецПроцедуры

Также в конфигурации должен быть создан Web-сервис WebCommonInfoBases, для которого должны быть определены операции:

CheckInfoBases, свойство Тип возвращаемого значения установлено в значение string, флажок Возможно пустое значение установлен. Остальные свойства установлены в значения по умолчанию. Параметры метода и их типы см. здесь.

GetInfoBases, свойство Тип возвращаемого значения установлено в значение string, флажок Возможно пустое значение установлен. Остальные свойства установлены в значения по умолчанию. Параметры метода и их типы см. здесь.

Текст операций Web-сервиса:

Копировать в буфер обмена
Функция CheckInfoBases(ClientID, InfoBasesCheckCode, InfoBaseChanged, URL)
    Если ClientID = "00000000-0000-0000-0000-000000000000"
   И InfoBasesCheckCode = "00000000-0000-0000-0000-000000000000" Тогда
   // это первое обращение клиента
   InfoBaseChanged = Истина;
   URL = "/listservice2/ws/WebCommonInfoBases";
   Возврат "";
    КонецЕсли;
    Клиент = Справочники.СписокОбщихБаз.НайтиПоКоду(ClientID);
    Если Клиент.Пустая() Тогда
   // нет такого клиента
   InfoBaseChanged = Ложь;
    Иначе
   // проверим, что список на стороне клиента и наш список не различаются
   Если InfoBasesCheckCode = Клиент.КодСписка Тогда
    // список не поменялся
    InfoBaseChanged = Ложь;
    URL = "";
   Иначе
    // список изменился
    InfoBaseChanged = Истина;
    URL = "/listservice2/ws/WebCommonInfoBases";
   КонецЕсли;
    КонецЕсли;
    Возврат "";
    КонецФункции
Функция GetInfoBases(ClientID, InfoBasesCheckCode, InfoBases)
    Если ClientID = "00000000-0000-0000-0000-000000000000" Тогда
   ТекПользователь = ПользователиИнформационнойБазы.ТекущийПользователь();
   // необходимо завести нового клиента
   // кодом элемента справочника будет уникальный идентификатор
   // пользователя информационной базы
   Объект = Справочники.СписокОбщихБаз.СоздатьЭлемент();
   Объект.Код = Строка(ТекПользователь.УникальныйИдентификатор);
   // именем клиента будет имя пользователя
   Объект.Наименование = ТекПользователь.Имя;
   // список ИБ пустой при первом обращении
   Объект.СписокИБ = "";
   Объект.Записать();
   // сформируем возвращаемые значения Web-сервиса
   InfoBasesCheckCode = Объект.КодСписка;
   InfoBases = Объект.СписокИБ;
   ClientID = Объект.Код;
    Иначе
   // здесь получим данные для существующего кода клиента
   Клиент = Справочники.СписокОбщихБаз.НайтиПоКоду(ClientID);
   Если Клиент.Пустая() Тогда
    // нет такого клиента
    InfoBasesCheckCode = "";
    InfoBases = "";
   Иначе
    InfoBasesCheckCode = Клиент.КодСписка;
    InfoBases = Клиент.СписокИБ;
   КонецЕсли;
    КонецЕсли;
    Возврат "";
КонецФункции

После создания конфигурации следует дважды опубликовать Web-сервис на веб-сервере (см. здесь). Затем необходимо запомнить адреса опубликованных Web-сервисов. Предположим, что Web-сервисы опубликованы по адресам:

http://localhost/listservice ‑ анонимный Web-сервис;

http://localhost/listservice2 ‑ Web-сервис, требующий аутентификации;

В информационной базе должны существовать пользователи Анонимный, и, например, пользователи с именами Оператор, Кладовщик, Бухгалтер.

Файл default.vrd, который описывает публикацию по адресу http://localhost/listservice имеет следующий вид:

Копировать в буфер обмена
<?xml version="1.0" encoding="UTF-8"?>
<point xmlns="http://v8.1c.ru/8.2/virtual-resource-system"
   xmlns:xs="http://www.w3.org/2001/XMLSchema"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   base="/listservice"
   ib="File=X:\DB\ListBase;Usr=Анонимный"
   enable="false">
    <ws>
   <point name="WebCommonInfoBases"
     enable="true"/>
    </ws>
</point>

Файл default.vrd, который описывает публикацию по адресу http://localhost/listservice2 имеет следующий вид:

Копировать в буфер обмена
<?xml version="1.0" encoding="UTF-8"?>
<point xmlns="http://v8.1c.ru/8.2/virtual-resource-system"
   xmlns:xs="http://www.w3.org/2001/XMLSchema"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   base="/listservice2"
   ib="File= X:\DB\ListBase;"
   enable="false">
    <ws>
   <point name="WebCommonInfoBases"
     enable="true"/>
    </ws>
</point>

В настройках веб-сервера, для которого выполнены публикации Web-сервиса получения списка общих информационных баз, должна быть запрещена обработка HTTP-запроса HEAD (по крайней мере для виртуальных каталогов, через которые выполняется обращение к Web-сервису). В противном случае Web-сервис не будет использоваться.

В форме настройки окна запуска (см. здесь) необходимо добавить Интернет-сервис с указанным выше адресом, с указанием суффикса ws: http://localhost/listservice/ws/.

После выполнения настройки следует запустить программу запуска. На предложение ввести имя пользователя и пароль доступа к Web-сервису «1С:Предприятия», следует вводить имена Оператор, Кладовщик, Бухгалтер. В справочнике СписокОбщихБаз появятся соответствующие записи. Если в реквизит СписокИБ каждого элемента справочника поместить свой список в формате v8i, то этот список будет добавляться в список информационных баз программы запуска, после выполнения аутентификации.

6.2. Интернет-сервис получения дистрибутива клиентского приложения

6.2.1. Общая информация

Примечание. Доступно только для лицензии КОРП. Подробнее о видах лицензий см. здесь.

При удаленной работе (через веб-сервер) возникает необходимость автоматического получения дистрибутива клиентского приложения в тех случаях, когда на сервере «1С:Предприятия» (или веб-сервере) выполнена замена версии системы. В этом случае поиск новой версии с помощью параметра DistributiveLocation конфигурационных файлов может не дать результат. Для получения дистрибутива можно воспользоваться возможностью публикации дистрибутива клиентского приложения через Интернет-сервис. При этом доступно получение списка как через HTTP-запросы и через Web-сервисы.

Если получение дистрибутива клиентского приложения выполняется с помощью HTTPS-соединения, то проверка сертификата сервера (с которого выполняется получение дистрибутива) выполняется с помощью сертификатов корневых удостоверяющих центров, получаемых из системного хранилища соответствующей ОС.

Другие способы обновления клиентского приложения см. здесь.

6.2.2. Получение через Web-сервис

Для получения дистрибутива клиентского приложения через Web-сервис необходимо опубликовать специальный Web-сервис, который будет возвращать этот дистрибутив. Рассмотрим работу этого Web-сервиса более подробно.

6.2.2.1. Описание функционирования

Тонкий клиент (1cv8c) может выполнять попытку установить необходимую версию тонкого клиента в том случае, если она не совпадает с версией кластера серверов «1С:Предприятия» или расширения веб-сервера. Для этого используются три механизма (по порядку использования):

1. Поиск дистрибутива в локальной сети ‑ с помощью параметров конфигурационных файлов (1cestart.cfg и 1cescmn.cfg) DistributiveLocation.

2. Получение дистрибутива клиентского приложения по URL, указанных в конфигурационных файлах default.vrd (атрибут элемента point, см. здесь) или conf.cfg (параметры PublishDistributiveLocation*, см. здесь). При этом приоритетным является значение, указанное в файле default.vrd.

3. Получение файла через Web-сервис получения дистрибутива клиентского приложения. Для этого адрес Web-сервиса необходимо указать в конфигурационном файле 1cestart.cfg (параметр InternetService или WebDistributiveLocation, подробнее см. здесь) или в диалоге настройке окна запуска, подробнее см. здесь.

Тонкий клиент анализирует результат обращения к Web-сервису. Если Web-сервис возвращает 0 в параметре Size, то считается, что необходимого дистрибутива необходимого клиентского приложения нет, и формируется ошибка о несоответствии версий клиентского приложения и сервера. В противном случае пользователю выдается запрос на скачивание и установку клиентского приложения, с указанием размера получаемого дистрибутива. При положительном ответе выполняется скачивание и установка новой версии, после чего происходит перезапуск нужной версии клиентского приложения. При выполнении загрузки файла дистрибутива тайм-аут на выполнение операции составляет 600 секунд. При выполнении загрузки дистрибутива не поддерживается перенаправление (redirect) на стороне веб-сервера.

6.2.2.2. Описание Web-сервиса

Имя Web-сервиса: WebDistributiveLocation. Тайм-аут на выполнение любого метода Web-сервиса составляет 3 секунды.

Методы Web-сервиса перечислены ниже.

GetDistributiveInfo

Описание:

Данный метод используется тонким клиентом (1cv8с) для получения дистрибутива клиентского приложения нужной версии в следующих случаях:

● Несовпадение версии клиентского приложения и сервера, в клиент-серверном варианте, при подключении через веб-сервер.

● Несовпадение версии клиентского приложения и расширения веб-сервера, в файловом варианте, при подключении через веб-сервер.

Параметры:

DistributiveType                           входной

Тип: Строка. Тип операционной системы, для которой необходимо получить дистрибутив клиентского приложения.

Возможные значения: Linux, LinuxDEB, LinuxRPM, MacOS, Windows.

Arch                                       входной

Тип: Строка. Архитектура операционной системы, для которой необходимо получить дистрибутив клиентского приложения.

Возможные значения: x86, x86_64.

Version                                    входной

Тип: Строка. Номер версии клиентского приложения, дистрибутив которого необходимо получить.

Size                                      выходной

Тип: Число. Размер дистрибутива клиентского приложения (в байтах). Если запрашиваемый дистрибутив отсутствует, необходимо вернуть значение 0.

URL                                       выходной

Тип: Строка. URL для скачивания дистрибутива клиентского приложения. При формировании URL следует помнить, что файл с дистрибутивом должен быть доступен веб-серверу, и у пользователя, который будет получать дистрибутив, также должны быть права на скачивание этого файла.

Дистрибутив клиентского приложение представляет из себя zip-архив файлов дистрибутива. Более подробная информация о содержимом zip-архива см. здесь.

Возвращаемое значение:

Тип произвольный, значение игнорируется.

6.2.2.3. Пример реализации

Рассмотрим пример Web-сервиса для получения дистрибутива клиентского приложения.

Примечание. Пример, приведенный в данном разделе, не является законченным. Он предназначен для демонстрации работы механизма.

В качестве Web-сервиса используется простая конфигурация, которая реализует, собственно, Web-сервис и не содержит никаких других объектов конфигурации. Дистрибутивы клиентского приложения будут расположены в специальном каталоге, к которому должен иметь доступ веб-сервер. В конфигурации должен быть создан Web-сервис WebDistributiveLocation, для которого должна быть определены операция GetDistributiveInfo, свойство Тип возвращаемого значения установлено в значение string, флажок Возможно пустое значение установлен. Остальные свойства установлены в значения по умолчанию. Параметры метода и их типы см. здесь.

Текст операций Web-сервиса:

Копировать в буфер обмена
Функция GetDistributiveInfo(OS, Arch, Version, Size, URL)
    КаталогДистрибутивов = "C:\inetpub\Distribs\";
    URLДистрибутивов = "http://host/site/distribs/";
    // сформируем имя файла с архивом
    ИмяФайла = "tc-" + НРег(OS) + "-" + Arch + "-" + Version + ".zip";
    Архив = Новый Файл(КаталогДистрибутивов + ИмяФайла);
    Если Архив.Существует() Тогда
   Size = Архив.Размер();
   URL = URLДистрибутивов + ИмяФайла;
    Иначе
   Size = 0;
   URL = "";
    КонецЕсли;
    Возврат "";
КонецФункции

Следует указать в переменных КаталогДистрибутивов и URLДистрибутивов правильные значения, соответствующие реальному имени каталога с дистрибутивами клиентского приложения (при обращении к нему из Web-сервиса ‑ переменная КаталогДистрибутивов и при обращении к нему через веб-сервис ‑ переменная URLДистрибутивов).

Имя файла с дистрибутивом должно иметь имя tc-windows-x86-8.3.24.100.zip или аналогичное (в зависимости от вида ОС и архитектуры запрашиваемого клиентского приложения). Имя файла с архивом определяется программным кодом приведенного выше демонстрационного Web-сервиса.

После создания конфигурации следует опубликовать Web-сервис на веб-сервере (см. здесь). Затем необходимо запомнить адрес опубликованного Web-сервиса. Предположим, что Web-сервис опубликован по адресу http://localhost/getdistr.

В форме настройки окна запуска (см. здесь) необходимо добавить Интернет-сервис с указанным выше адресом, с указанием суффикса ws: http://localhost/getdistr/ws. Теперь при необходимости получения дистрибутива будет выполнен запрос у Web-сервису. Если в каталоге КаталогДистрибутивов (на компьютере в Web-сервисом) будет zip-архив с нужным дистрибутивом ‑ этот файл будет передан на компьютер, который запросил дистрибутив.

6.3. Web-сервис внешнего управления сеансами

6.3.1. Общая информация

Для внешнего управления сеансами необходимо реализовать Web-сервис, который будет предоставлять определенный набор методов и логику управления. Этот Web-сервис может быть реализован как средствами системы «1С:Предприятие», так и сторонними средствами. Структура типа Sessions зависит от того, какая версия Web-сервиса используется.

Далее будет дано описание Web-сервиса и приведен пример реализации средствами «1С:Предприятие».

6.3.2. Описание Web-сервиса

Имя Web-сервиса не специфицируется. Тайм-аут на выполнение методов равен 5 секунд (по умолчанию) или задается параметром tout при вызове Web-сервиса.

6.3.2.1. Версия 1

onStartSession

Описание:

Метод вызывается кластером серверов при начале сеанса, которому требуется клиентская лицензия:

● конфигуратор,

● толстый клиент,

● внешнее соединение,

● тонкий клиент,

● веб-клиент,

● мобильный клиент,

● клиент системы 1С:Аналитика.

Метод должен определить, допустимо или нет создание нового сеанса с указанными параметрами. Решение сообщается кластеру серверов в виде кода возврата.

Параметры:

CallNo                                     входной

Тип: Число. Порядковый номер вызова. При каждом вызове Web-сервиса кластером порядковый номер вызова увеличивается на 1. На основании значения CallNo Web-сервис может запросить синхронизацию данных о сеансах.

Номер вызова уникален в разрезе информационной базы.

ClusterID                                  входной

Тип: Строка. Идентификатор кластера серверов. Содержит строковое представление уникального идентификатора (UUID).

ClusterName                                входной

Тип: Строка. Имя кластера серверов, в котором расположена информационная база.

InfoBaseName                               входной

Тип: Строка. Имя информационной базы, для работы с которой создается сеанс.

SessionID                                  входной

Тип: Строка. Идентификатор сеанса. Содержит строковое представление уникального идентификатора (UUID).

UserID                                     входной

Тип: Строка. Идентификатор пользователя. Содержит строковое представление уникального идентификатора (UUID).

UserName                                   входной

Тип: Строка. Имя пользователя.

AppID                                      входной

Тип: Строка. Имя приложения, пытающегося получить доступ к информационной базе. Подробную информацию о значениях этого параметра можно получить в описании функции глобального контекста ПредставлениеПриложения().

Zone                                       входной

Тип: Строка. Содержит начальные значения разделителей для создаваемого сеанса. Строка передается в формате, который указывается для ключа командной строки запуска приложения /Z.

LanguageCode                               входной

Тип: Строка. Код языка сообщений для создаваемого сеанса.

ErrorDescription                          выходной

Тип: Строка. Содержит описание причины запрета создания сеанса в виде, пригодном для чтения и понимания пользователем. Заполняется в случае, если метод Web-сервиса возвращает значение 1.

Возвращаемое значение:

Тип: Число. Возвращаемое значение может быть одним из следующих:

● 0 ‑ сеанс может быть создан.

● 1 ‑ сеанс не может быть создан. Пользователю, начинающему сеанс, выдается сообщение об ошибке входа с текстом исключения из параметра ErrorDescription, или с текстом Начало сеанса запрещено сервисом внешнего управления сеансами, если значение параметра ErrorDescription равно пустой строке.

● 2 ‑ требуется выполнить синхронизация. В этом случае кластер серверов вызовет метод synchronize со списком сеансов, не включающим этот сеанс, после чего повторит вызов метода onStartSession. Вызовы внешнего управления сеансами не синхронизируются и определение необходимости синхронизации списка сеансов возложено на сервис внешнего управления сеансами. В качестве исходной информации может быть использован порядковый номер вызова (параметр CallNo). Пропуск некоторых номеров вызовов после некоторого ожидания может считаться условием, требующим синхронизации.

onFinishSession

Описание:

Метод вызывается при завершении работы сеанса.

Параметры:

CallNo                                     входной

Тип: Число. Порядковый номер вызова.

Номер вызова уникален в разрезе информационной базы.

ClusterID                                  входной

Тип: Строка. Идентификатор кластера серверов. Содержит строковое представление уникального идентификатора (UUID).

SessionID                                  входной

Тип: Строка. Идентификатор сеанса. Содержит строковое представление уникального идентификатора (UUID).

Возвращаемое значение:

Отсутствует.

synchronize

Описание:

Предназначен для синхронизации данных о созданных сеансах между кластером серверов и Web-сервисом, реализующим механизм внешнего управления сеансами. Вызывает кластером серверов в случае, если метод onStartSession() вернул значение 2.

Параметры:

CallNo                                     входной

Тип: Число. Порядковый номер вызова.

Номер вызова уникален в разрезе информационной базы.

ClusterID                                  входной

Тип: Строка. Идентификатор кластера серверов. Содержит строковое представление уникального идентификатора (UUID).

ClusterName                                входной

Тип: Строка. Имя кластера серверов, в котором расположена информационная база.

InfoBaseName                               входной

Тип: Строка. Имя информационной базы, для которой выполняется синхронизация информации о количестве сеансов.

CurrentSessions                            входной

Тип: Sessions. Объект содержит данные обо всех сеансах, которые созданы для конкретной информационной базы с использованием механизма внешнего управления сеансами. Объект содержит свойство Content, который является коллекцией объектов Session, которые описывают один сеанс. Коллекция может быть пустой. Описание объекта Sessions см. здесь.

Возвращаемое значение:

Отсутствует.

6.3.2.2. Версия 2

Дополнительно к возможностям, предоставляемых версией 1, версия 2 содержит два метода, которые позволяют учитывать переход сеанса в состояние Спящий и возврат его в рабочее состояние (см. здесь.

onHibernateSession

Описание:

Метод вызывается кластером серверов при переводе сеанса в спящее состояние. При переводе сеанса в спящее состояние сеанс перестает занимать лицензию (см. здесь), что необходимо учесть в данных Web-сервиса. При начале работы сеанса, который переводится в состояние Спящий, кластер серверов вызывал метод onStartSession данного Web-сервиса.

Параметры:

CallNo                                     входной

Тип: Число. Порядковый номер вызова.

Номер вызова уникален в разрезе информационной базы.

ClusterID                                  входной

Тип: Строка. Идентификатор кластера серверов. Содержит строковое представление уникального идентификатора (UUID).

SessionID                                  входной

Тип: Строка. Идентификатор сеанса. Содержит строковое представление уникального идентификатора (UUID).

Возвращаемое значение:

Отсутствует.

onWakeupSession

Описание:

Параметры:

CallNo                                     входной

Тип: Число. Порядковый номер вызова. При каждом вызове Web-сервиса кластером порядковый номер вызова увеличивается на 1. На основании значения CallNo Web-сервис может запросить синхронизацию данных о сеансах.

Номер вызова уникален в разрезе информационной базы.

ClusterID                                  входной

Тип: Строка. Идентификатор кластера серверов. Содержит строковое представление уникального идентификатора (UUID).

SessionID                                  входной

Тип: Строка. Идентификатор сеанса. Содержит строковое представление уникального идентификатора (UUID).

ErrorDescription                          выходной

Тип: Строка. Содержит описание причины запрета перевода сеанса рабочее состояние в виде, пригодном для чтения и понимания пользователем. Заполняется в случае, если метод Web-сервиса возвращает значение 1.

Возвращаемое значение:

Тип: Число. Возвращаемое значение может быть одним из следующих:

● 0 ‑ сеанс может быть переведен в рабочее состояние.

● 1 ‑ сеанс не может быть переведен в рабочее состояние. Пользователю, чей сеанс пытается перейти в рабочее состояние, выдается сообщение об ошибке входа с текстом исключения из параметра ErrorDescription, или с текстом Пробуждение сеанса запрещено сервисом внешнего управления сеансами, если значение параметра ErrorDescription равно пустой строке.

● 2 ‑ требуется выполнить синхронизация. В этом случае кластер серверов вызовет метод synchronize со списком сеансов, не включающим этот сеанс, после чего повторит вызов метода onWakeupSession. Вызовы внешнего управления сеансами не синхронизируются и определение необходимости синхронизации списка сеансов возложено на сервис внешнего управления сеансами. В качестве исходной информации может быть использован порядковый номер вызова (параметр CallNo). Пропуск некоторых номеров вызовов после некоторого ожидания может считаться условием, требующим синхронизации.

6.3.2.3. Версия 3

В версии 3 расширен состав параметров метода onStartSession(): добавлены параметры SessionNumber и ClientIPAddress.

onStartSession

Описание:

Метод вызывается кластером серверов при начале сеанса (кроме сеанса фонового задания и сеанса WS-соединения). Метод должен определить, допустимо или нет создание нового сеанса с указанными параметрами. Решение сообщается кластеру серверов в виде кода возврата.

Параметры:

CallNo                                     входной

Тип: Число. Порядковый номер вызова. При каждом вызове Web-сервиса кластером порядковый номер вызова увеличивается на 1. На основании значения CallNo Web-сервис может запросить синхронизацию данных о сеансах.

Номер вызова уникален в разрезе информационной базы.

ClusterID                                  входной

Тип: Строка. Идентификатор кластера серверов. Содержит строковое представление уникального идентификатора (UUID).

ClusterName                                входной

Тип: Строка. Имя кластера серверов, в котором расположена информационная база.

InfoBaseName                               входной

Тип: Строка. Имя информационной базы, для работы с которой создается сеанс.

SessionID                                  входной

Тип: Строка. Идентификатор сеанса. Содержит строковое представление уникального идентификатора (UUID).

SessionNumber                              входной

Тип: Число. Номер сеанса. Содержит номер сеанса в рамках информационной базы.

UserID                                     входной

Тип: Строка. Идентификатор пользователя. Содержит строковое представление уникального идентификатора (UUID).

UserName                                   входной

Тип: Строка. Имя пользователя.

ClientIPAddress                            входной

Тип: Строка. IP-адрес клиентского приложения, пытающегося начать сеанс.

AppID                                      входной

Тип: Строка. Имя приложения, пытающегося получить доступ к информационной базе. Подробную информацию о значениях этого параметра можно получить в описании функции глобального контекста ПредставлениеПриложения().

Zone                                       входной

Тип: Строка. Содержит начальные значения разделителей для создаваемого сеанса. Строка передается в формате, который указывается для ключа командной строки запуска приложения /Z.

LanguageCode                               входной

Тип: Строка. Код языка сообщений для создаваемого сеанса.

ErrorDescription                          выходной

Тип: Строка. Содержит описание причины запрета создания сеанса в виде, пригодном для чтения и понимания пользователем. Заполняется в случае, если метод Web-сервиса возвращает значение 1. В качестве значения данного возвращаемого параметра может выступать как просто строка, так и значение типа ФорматированнаяСтрока, преобразованная следующим образом: СериализаторXDTO.XMLСтрока(формСтрока).

Возвращаемое значение:

Тип: Число. Возвращаемое значение может быть одним из следующих:

● 0 ‑ сеанс может быть создан.

● 1 ‑ сеанс не может быть создан. Пользователю, начинающему сеанс, выдается сообщение об ошибке входа с текстом исключения из параметра ErrorDescription, или с текстом Начало сеанса запрещено сервисом внешнего управления сеансами, если значение параметра ErrorDescription равно пустой строке.

● 2 ‑ требуется выполнить синхронизация. В этом случае кластер серверов вызовет метод synchronize со списком сеансов, не включающим этот сеанс, после чего повторит вызов метода onStartSession. Вызовы внешнего управления сеансами не синхронизируются и определение необходимости синхронизации списка сеансов возложено на сервис внешнего управления сеансами. В качестве исходной информации может быть использован порядковый номер вызова (параметр CallNo). Пропуск некоторых номеров вызовов после некоторого ожидания может считаться условием, требующим синхронизации.

6.3.2.4. Версия 4

В версии 4 расширен состав полей объекта Session, коллекция которых передается в качестве параметра CurrentSessions метода synchronize():

SessionNumber ‑ номер сеанса.

ClientIPAddress ‑ IP-адрес клиентского приложения.

6.3.2.5. Описание типа Sessions

6.3.2.5.1. Версия 1

Описание объекта Sessions (в формате XSD), версии с 1 по 3 (включительно):

Копировать в буфер обмена
<xs:schema xmlns:ns1="http://v8.1c.ru/8.1/data/core" xmlns:tns="http://v8.1c.ru/SessionManagement" xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="http://v8.1c.ru/SessionManagement" attributeFormDefault="unqualified" elementFormDefault="qualified">
    <xs:import namespace="http://v8.1c.ru/8.1/data/core"/>
    <xs:complexType name="Session">
   <xs:sequence>
    <xs:element name="SessionID" type="xs:string"/>
    <xs:element name="UserID" type="xs:string"/>
    <xs:element name="UserName" type="xs:string"/>
    <xs:element name="AppID" type="xs:string"/>
    <xs:element name="Zone" type="xs:string"/>
    <xs:element name="LanguageCode" type="xs:string"/>
    <xs:element name="Hibernate" type="xs:boolean"/>
   </xs:sequence>
    </xs:complexType>
    <xs:complexType name="Sessions">
   <xs:sequence>
    <xs:element name="Content" type="tns:Session" minOccurs="0" maxOccurs="unbounded"/>
   </xs:sequence>
    </xs:complexType>
</xs:schema>
6.3.2.5.2. Версия 4

Описание объекта Sessions (в формате XSD), начиная с версии 4:

Копировать в буфер обмена
<xs:schema xmlns:ns1="http://v8.1c.ru/8.1/data/core" xmlns:tns="http://v8.1c.ru/SessionManagement" xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="http://v8.1c.ru/SessionManagement" attributeFormDefault="unqualified" elementFormDefault="qualified">
    <xs:import namespace="http://v8.1c.ru/8.1/data/core"/>
    <xs:complexType name="Session">
   <xs:sequence>
    <xs:element name="SessionID" type="xs:string"/>
    <xs:element name="SessionNumber" type="xs:decimal"/> <!-- v4 -->
    <xs:element name="UserID" type="xs:string"/>
    <xs:element name="UserName" type="xs:string"/>
    <xs:element name="AppID" type="xs:string"/>
    <xs:element name="Zone" type="xs:string"/>
    <xs:element name="LanguageCode" type="xs:string"/>
    <xs:element name="Hibernate" type="xs:boolean"/>
    <xs:element name="ClientIPAddress" type="xs:string"/> <!-- v4 -->
   </xs:sequence>
    </xs:complexType>
    <xs:complexType name="Sessions">
   <xs:sequence>
    <xs:element name="Content" type="tns:Session" minOccurs="0" maxOccurs="unbounded"/>
   </xs:sequence>
    </xs:complexType>
</xs:schema>

6.3.3. Пример реализации

Рассмотрим пример Web-сервиса внешнего управления сеансами.

Примечание. Пример, приведенный в данном разделе, не является законченным. Он предназначен для демонстрации работы механизма.

Данный пример будет реализовывать следующую схему работы:

● Администратор может ограничиваться количество одновременных сеансов для информационной базы. Для этого указывается название информационной базы и указывается количество одновременных сеансов.

● Если информационной базы нет в списке ‑ количество сеансов с ней не ограничено.

● В процессе работы в списке можно посмотреть, какие сеансы существуют у данной информационной базы.

В качестве Web-сервиса используется простая конфигурация, которая содержит один справочник и один Web-сервис. Справочник содержит список информационных баз, ограничение по количеству сеансов и порядковый номер последнего вызова. Web-сервис выполняет действия по учету сеансов.

Справочник имеет следующие характеристики:

● Имя: ДоступныеСеансы.

● Длина кода: 0.

● Длина наименования: 50.

● Реквизиты:

● Имя: Количество, тип Число(2), неотрицательное.

● Имя: ПоследнийНомерВызова, тип Число(10), неотрицательное.

● Табличная часть:

● Имя: ТекущиеСеансы.

● Реквизиты:

● Имя: SessionID, тип Строка(40), переменной длины.

● Имя: UserID, тип Строка неограниченной длины.

● Имя: UserName, тип Строка неограниченной длины.

● Имя: AppID, тип Строка неограниченной длины.

● Имя: Zone, тип Строка неограниченной длины.

● Имя: LanguageCode, тип Строка неограниченной длины.

● Имя: Hibernate, тип Булево.

Данный справочник будет хранить имя информационной базы (стандартный реквизит Наименование), максимальное количество одновременных сеансов для этой базы (реквизит Количество) и порядковый номер последнего вызова Web-сервиса (реквизит ПоследнийНомерВызова). С помощью реквизита ПоследнийНомерВызова будет определяться необходимость синхронизации данных между кластером серверов «1С:Предприятия» и Web-сервисом. Табличная часть будет хранить информацию о тех сеансах, которые Web-сервис разрешил начать. В методе onStartSession() запись о сеансе будет создаваться, а в методе onFinishSession() запись о сеансе будет удаляться. Таким образом, сопоставляя максимальное количество сеансов, разрешенных для данной информационной базы, и количество запомненных сеансов, можно принять решение о возможности создания очередного сеанса. Если используется вторая версия интерфейса, то также будут фиксироваться переводы сеансов в спящий режим и пробуждение сеансов. При переводе сеанса в спящий режим, запись о сеансе не удаляется, а помечается соответствующим образом.

Также нужно создать Web-сервис, который описан выше (см. здесь), и поместить в модуль Web-сервиса нижеследующий программный код. Web-сервис должен содержать ссылку на пакет XDTO http://v8.1c.ru/SessionManagement, описывающий объект Sessions. Описание этого пакета см. здесь.

Текст операций Web-сервиса:

Копировать в буфер обмена
Функция onStartSession(CallNo, ClusterID, ClusterName, InfoBaseName, SessionID, UserID, UserName, AppID, Zone, LanguageCode, ErrorDescription)
    ErrorDescription = "";
    Результат = Справочники.ДоступныеСеансы.НайтиПоНаименованию(InfoBaseName, Истина);
    Если Результат.Пустая() Тогда
   // Если в справочнике нет базы с таким именем - значит для нее нет ограничений
   Возврат 0;
    КонецЕсли;
    Объект = Результат.ПолучитьОбъект();
    Объект.ПоследнийНомерВызова = Объект.ПоследнийНомерВызова + 1;
    // Проверим - если нарушена последовательность вызовов, то потребуется синхронизация
    Если Объект.ПоследнийНомерВызова <> CallNo Тогда
   Возврат 2;
    КонецЕсли;
    Сеансы = Результат.ТекущиеСеансы.НайтиСтроки(Новый Структура("Hibernate", Ложь));
    Если Сеансы.Количество()+1 > Результат.Количество Тогда
   // достигнуто максимальное количество сеансов, больше нельзя
   Объект.Записать();
   ErrorDescription = "Превышено максимальное количество сеансов, разрешенных сервисом внешнего управления сеансами";
   Возврат 1;
    Иначе
   // сеансы еще возможны
   Строка = Объект.ТекущиеСеансы.Добавить();
   Строка.SessionID = SessionID;
   Строка.UserID = UserID;
   Строка.UserName = UserName;
   Строка.AppID = AppID;
   Строка.Zone = Zone;
   Строка.LanguageCode = LanguageCode;
   Строка.Hibernate = Ложь;
   Объект.Записать();
   Возврат 0;
    КонецЕсли;
КонецФункции
Функция onFinishSession(CallNo, ClusterID, SessionID)
    Запрос = Новый Запрос;
    Запрос.Текст =
   "ВЫБРАТЬ
   |    ДоступныеСеансы.Ссылка
   |ИЗ
   |    Справочник.ДоступныеСеансы КАК ДоступныеСеансы
   |ГДЕ
   |    ДоступныеСеансы.ТекущиеСеансы.SessionID = &SessionID";
    Запрос.УстановитьПараметр("SessionID", SessionID);
    РезультатЗапроса = Запрос.Выполнить();
    ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
    Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
   // удалим сеанс из базы сервиса
   Объект = ВыборкаДетальныеЗаписи.Ссылка.ПолучитьОбъект();
   Результат = Объект.ТекущиеСеансы.НайтиСтроки(Новый Структура("SessionID", SessionID));
   Для Каждого Строка Из Результат Цикл
    Объект.ТекущиеСеансы.Удалить(Объект.ТекущиеСеансы.Индекс(Строка));
   КонецЦикла;
   Объект.ПоследнийНомерВызова = CallNo;
   Объект.Записать();
    КонецЦикла;
    Возврат Неопределено;
КонецФункции
Функция Synchronize(CallNo, ClusterID, ClusterName, InfoBaseName, CurrentSessions)
    Результат = Справочники.ДоступныеСеансы.НайтиПоНаименованию(InfoBaseName, Истина);
    Если Результат.Пустая() Тогда
   // Если в справочнике нет базы с таким именем - значит для нее нет ограничений
   Возврат Неопределено;
    КонецЕсли;
    // сеансы еще возможны
    Объект = Результат.ПолучитьОбъект();
    Объект.ТекущиеСеансы.Очистить();
    Для каждого Сеанс Из CurrentSessions.Content Цикл
   Строка = Объект.ТекущиеСеансы.Добавить();
   Строка.SessionID = Сеанс.SessionID;
   Строка.UserID = Сеанс.UserID;
   Строка.UserName = Сеанс.UserName;
   Строка.AppID = Сеанс.AppID;
   Строка.Zone = Сеанс.Zone;
   Строка.LanguageCode = Сеанс.LanguageCode;
    КонецЦикла;
    Объект.ПоследнийНомерВызова = CallNo;
    Объект.Записать();
    Возврат Неопределено;
КонецФункции
Функция onHibernateSession(CallNo, ClusterID, SessionID)
    Запрос = Новый Запрос;
    Запрос.Текст =
   "ВЫБРАТЬ
   |    ДоступныеСеансы.Ссылка
   |ИЗ
   |    Справочник.ДоступныеСеансы КАК ДоступныеСеансы
   |ГДЕ
   |    ДоступныеСеансы.ТекущиеСеансы.SessionID = &SessionID";
    Запрос.УстановитьПараметр("SessionID", SessionID);
    РезультатЗапроса = Запрос.Выполнить();
    ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
    Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
   // пометим сеанс в базе сервиса как спящий
   Объект = ВыборкаДетальныеЗаписи.Ссылка.ПолучитьОбъект();
   Результат = Объект.ТекущиеСеансы.НайтиСтроки(Новый Структура("SessionID", SessionID));
   Для Каждого Строка Из Результат Цикл
    Строка.Hibernate = Истина;
   КонецЦикла;
   Объект.ПоследнийНомерВызова = CallNo;
   Объект.Записать();
    КонецЦикла;
    Возврат Неопределено;
КонецФункции
Функция onWakeupSession(CallNo, ClusterID, SessionID, ErrorDescription)
    Запрос = Новый Запрос;
    Запрос.Текст =
   "ВЫБРАТЬ
   |    ДоступныеСеансы.Ссылка
   |ИЗ
   |    Справочник.ДоступныеСеансы КАК ДоступныеСеансы
   |ГДЕ
   |    ДоступныеСеансы.ТекущиеСеансы.SessionID = &SessionID";
    Запрос.УстановитьПараметр("SessionID", SessionID);
    РезультатЗапроса = Запрос.Выполнить();
    Если РезультатЗапроса.Пустой() Тогда
   ErrorDescription = "Пробуждение невозможно! Старт сеанса с номером " + SessionID + " не зафиксирован сервисом";
   Возврат 1;
    КонецЕсли;
    ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
    Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
   // Проверим - если нарушена последовательность вызовов, то потребуется синхронизация
   Если ВыборкаДетальныеЗаписи.Ссылка.ПоследнийНомерВызова+1 <> CallNo Тогда
    Возврат 2;
   КонецЕсли;
   // пометим сеанс в базе сервиса как спящий
   Объект = ВыборкаДетальныеЗаписи.Ссылка.ПолучитьОбъект();
   // получим количество неспящих сеансов
   Неспящих = Объект.ТекущиеСеансы.НайтиСтроки(Новый Структура("Hibernate", Истина)).Количество();
   // начнем просыпаться
   Результат = Объект.ТекущиеСеансы.НайтиСтроки(Новый Структура("SessionID", SessionID));
   Для Каждого Строка Из Результат Цикл
    Если Неспящих > Объект.Количество Тогда
     ErrorDescription = "Пробуждение невозможно! Превышено максимальное количество сеансов, разрешенных сервисом внешнего управления сеансами";
     Возврат 1;
    КонецЕсли;
    Неспящих = Неспящих+1;
    Строка.Hibernate = Ложь;
   КонецЦикла;
   Объект.ПоследнийНомерВызова = CallNo;
   Объект.Записать();
    КонецЦикла;
    Возврат 0;
КонецФункции

После создания конфигурации следует опубликовать Web-сервис на веб-сервере. Подробности публикации Web-сервиса описаны в книге.

Предположим, что публикация называется sc, Web-сервис имеет имя SessionControl, пространство имен этого Web-сервиса http://v8.1c.ru/SessionManagement, и в состав пакетов XDTO должен входить пакет http://v8.1c.ru/SessionManagement. Публикация выполняется на компьютере localhost.

После публикации и проверки корректности опубликования Web-сервиса необходимо сформировать строку, указывающую кластеру серверов на созданный Web-сервис. Описание строки см. здесь.

Строка будет иметь вид:

Копировать в буфер обмена
wsdl=http://localhost/sc/ws/SessionControl?wsdl;ns=http://v8.1c.ru/SessionManagement;srvc=SessionControl;port=SessionControlSoap;wsver=4;

Также необходимо создать клиент-серверную информационную базу, чьими сеансами будет управлять созданный Web-сервис. Зададим этой информационной базе имя TestDB. Это может быть любая информационная база (в том числе и пустая). После создания, с помощью консоли кластера следует указать в качестве значения свойства Внешнее управление сеансами созданную выше строку (wsdl=…), и установить флажок для свойства Обязательное использование внешнего управления.

Затем необходимо запустить информационную базу управления сеансами в режиме 1С:Предприятие и в справочнике ДоступныеСеансы создать один элемент, у которого стандартный реквизит Наименование должен принимать значение TestDB, а реквизит Количество ‑ значение 2. Таким образом, мы определили, что для информационной базы TestDB доступно не более 2 одновременных сеансов.

Теперь в информационную базу TestDB можно войти не более двух раз.

6.4. HTTP-сервис получения параметров производительности

6.4.1. Общая информация

Примечание. Доступно только для лицензии КОРП. Подробнее о видах лицензий см. здесь.

Система «1С:Предприятие» предоставляет возможность получения показателей производительности кластера серверов с помощью HTTP-запросов. Такая возможность поддерживается с помощью сервера администрирования кластера серверов (ras), а также при использовании автономного сервера (ibsrv). Получение метрик производительности файлового варианта информационной базы не поддерживается. В качестве синонима термина «показатели производительности» возможно использование термина «метрики производительности» или просто «метрики».

Показатели производительности предоставляются в формате OpenMetrics.

Для получения показателей следует обратиться по адресу вида: http://server.host:port/resource, где:

http://server.host:port ‑ адрес сервера администрирования кластера серверов (ras) или соответствующего шлюза автономного сервера.

resource ‑ имя ресурса, при обращении к которому происходит получение метрик производительности. Имя задается при настройке доступа к показателям производительности.

Для того, чтобы запустить HTTP-сервис, необходимо выполнить следующие действия:

● Для сервера администрирования (ras): запустить сервер администрирования с явным указанием значения какого-либо из параметров управления сервиса, например, --monitor-base=/metrics. Имя ресурса всегда должно предваряться символом "/".

● Для автономного сервера: необходимо запустить автономный сервер таким образом, чтобы к автономному серверу был разрешен доступ по протоколу HTTP и был инициализирован шлюз показателей производительности. Это необходимо сделать или с помощью параметров командной строки запуска автономного сервера, или с помощью конфигурационного файла автономного сервера.

Если в кластере серверов заданы администраторы, то для получения метрик требуется аутентификация при выполнении запроса к HTTP-сервису. В противном случае (администраторы кластера не заданы) ‑ запрос может быть выполнен без аутентификации. Сервис получения метрик использует basic-аутентификацию.

Использовании basic-аутентификации зависит от способа формирования запроса к HTTP -сервису метрик производительности:

● С помощью заголовков запроса. В этом случае необходимо указать заголовок HTTP-запроса Authorization, значением которого будет строка вида Basic base64(username:password), где:

Basic ‑ признак basic-аутентификации.

username:password ‑ имя и пароль одного из администраторов кластера серверов.

base64() ‑ означает, что текст с аутентификационными данными следует закодировать в формате Base64.

● Пример: Authorization: Basic YWxhZGRpbjpvcGVuc2VzYW1l.

● При доступе с помощью встроенного языка система «1С:Предприятие», следует использовать свойства Пользователь и Пароль объекта HTTPСоединение. В эти свойства следует указать имя и пароль одного из администраторов кластера серверов.

Смотри также:

● Описание формата OpenMetrics (https://github.com/OpenObservability/OpenMetrics/blob/main/specification/OpenMetrics.md).

● Запуск сервера администрирования кластера серверов (см. здесь).

● Шлюз монитора производительности автономного сервера (см. здесь).

6.4.2. Способы фильтрации метрик производительности

Для получения метрик производительности служит «язык запросов», который представляет собой набор параметров при обращении к HTTP-сервису. В результате такого запроса будет получен некоторый набор метрик, который соответствует параметрам запроса. Каждая метрика, кроме своего имени, обладает так называемой меткой. Каждая метка имеет свое значение. Таким образом, указывая отбор по значению какой-либо метки мы, во-первых, ограничиваем список метрик только теми, которые помечены этой меткой, а во-вторых, получаем только те метрики, у которых требуемая метка равна значению отбора. В некотором смысле можно сказать, что метки образуют измерения регистра сведений, а сами метрики выступают в виде ресурсов такого регистра. Также имеется возможность отбирать нужные метрики по их (метрик) именам. Для этого можно использовать подмножество регулярных выражений.

Для получения метрик доступны следующие параметры запроса:

Параметр

Описание

<label>=<value>

Позволяет указать отбор по значению метки. Отбор работает только на равенство и по строгому соответствию значений.

filter=<value>

Позволяет указать отбор по имени метрики. В качестве значения может выступать регулярное выражение, которое может включать следующие операторы:

* ‑ ноль или более любых символов.

? ‑ один любой символ.

[!abc] ‑ любой символ, кроме указанных.

[abc] ‑ любой из указанных символов.

[a-z] ‑ любой из диапазона указанных символов.

managers=<value>

Позволяет включать и выключать получение метрик менеджеров кластера.

Доступные значения:

true, 1 ‑ включить получение метрик.

false, 0 ‑ выключить получение метрик.

Значение по умолчанию: true.

processes=<value>

Позволяет включать и выключать получение метрик рабочих процессов.

Доступные значения:

true, 1 ‑ включить получение метрик.

false, 0 ‑ выключить получение метрик.

Значение по умолчанию: true.

servers=<value>

Позволяет включать и выключать получение метрик рабочих серверов.

Доступные значения:

true, 1 ‑ включить получение метрик.

false, 0 ‑ выключить получение метрик.

Значение по умолчанию: true.

sessions=<value>

Позволяет включать и выключать получение метрик сеансов информационных баз.

Доступные значения:

true, 1 ‑ включить получение метрик.

false, 0 ‑ выключить получение метрик.

Значение по умолчанию: false.

Если в запросе указано несколько одноименных параметров ‑ эти параметры будут объединены «по ИЛИ». Разноименные параметры будут объединены «по И».

6.4.3. Доступные метрики производительности

6.4.3.1. Общая информация

Данный раздел описывает доступные метрики производительности, сгруппированные по какому-либо объекту кластера серверов. Каждая метрика содержит описание (как соответствующая метрика отображается в консоли кластера), идентификатор (имя метрики) и тип значения метрики. Если в двух соседних строка таблицы со списком метрик присутствуют строки вида «Описание значения» и "… какое-то дополнение», то это означает, что во второй строке подразумевается следующий текст "Описание значения какое-то дополнение».

После списка метрик указывается список меток, которые сопровождают каждую метрику.

6.4.3.2. Метрики сеансов

Перечень метрик:

Описание

Имя метрики

Тип

Количество вызовов сервера за сеанс

e1c_session_calls_total

uint64

... за последние 5 мин.

e1c_session_calls_last_5min

uint64

Количество данных, полученных от клиента за сеанс, байт

e1c_session_received_total

uint64

... за последние 5 мин., байт

e1c_session_received_last_5min

uint64

Количество данных, переданных клиенту за сеанс, байт

e1c_session_transmitted_total

uint64

... за последние 5 мин., байт

e1c_session_transmitted_last_5min

uint64

Время выполнения на сервере на сеанс, миллисекунды

e1c_session_server_time_total

uint64

... за последние 5 мин., миллисекунды

e1c_session_server_time_last_5min

uint64

Время последнего вызова на сервера, миллисекунды

e1c_session_server_time_current

uint64

Количество запросов к СУБД за сеанс

e1c_session_dbms_calls_total

uint64

... за последние 5 мин.

e1c_session_dbms_calls_last_5min

uint64

Время запросов к СУБД на сеанс, миллисекунды

e1c_session_dbms_time_total

uint64

... за последние 5 мин., миллисекунды

e1c_session_dbms_time_last_5min

uint64

Время последнего запроса к СУБД, миллисекунды

e1c_session_dbms_time_current

uint64

Время в миллисекундах с момента захвата текущего соединения с СУБД или 0, если не захвачено

e1c_session_dbms_transaction_time_current

uint64

Количество обращений к менеджеру блокировок за сеанс

e1c_session_lock_calls_total

uint64

... за последние 5 мин.

e1c_session_lock_calls_last_5min

uint64

Время ожидания установки блокировок на сеанс, миллисекунды

e1c_session_lock_time_total

uint64

... за последние 5 мин., миллисекунды

e1c_session_lock_time_last_5min

uint64

Время вызова менеджера кластера, миллисекунды

e1c_session_manager_time_total

uint64

... за последние 5 мин., миллисекунды

e1c_session_manager_time_last_5min

uint64

Время вызова менеджера кластера в текущем вызове, миллисекунды

e1c_session_manager_time_current

uint64

Объем данных, переданных в СУБД за сеанс

e1c_session_dmbs_transmitted_total

uint64

... за последние 5 мин.

e1c_session_dmbs_transmitted_last_5min

uint64

Объем данных, полученных от СУБД за сеанс, байт

e1c_session_dmbs_received_total

uint64

... за последние 5 мин., байт

e1c_session_dmbs_received_last_5min

uint64

Объем памяти, занятой за сеанс, байт

e1c_session_memory_total

int64

... за последние 5 мин., байт

e1c_session_memory_last_5min

int64

... текущее, байт

e1c_session_memory_current

int64

Объем прочитанных данных из файлов за сеанс, байт

e1c_session_read_total

uint64

... за последние 5 мин., байт

e1c_session_read_last_5min

uint64

... текущее, байт

e1c_session_read_current

uint64

Объем записанных данных в файлы за сеанс, байт

e1c_session_write_total

uint64

... за последние 5 мин., байт

e1c_session_write_last_5min

uint64

... текущее, байт

e1c_session_write_current

uint64

Процессорное время за сеанс, миллисекунды

e1c_session_cpu_time_total

uint64

Процессорное время за последние 5 мин., миллисекунды

e1c_session_cpu_time_last_5min

uint64

... текущее, миллисекунды

e1c_session_cpu_time_current

uint64

Метрики сопровождаются следующими метками:

Метка

Описание

client_app *

Тип клиентского приложения

client_host *

Имя хоста клиентского приложения

client_ip *

IP-адрес клиента

cluster

Идентификатор кластера

infobase *

Идентификатор информационной базы

infobase_name *

Наименование информационной базы в кластере

session *

Идентификатор сессии

session_number

Номер сессии

user *

Имя аутентифицированного пользователя сессии

Если получение метрик сеансов выполняется из автономного сервера, то метрики сеансов могут иметь только метки, отмеченные в таблице выше символом "*".

6.4.3.3. Метрики сеансов в разрезе профилей безопасности

Перечень метрик:

Описание

Имя метрики

Тип

Время вызова менеджера кластера с начала сеанса, миллисекунды

e1c_session_profile_manager_time_total

uint64

Время вызова менеджера кластера текущее, миллисекунды

e1c_session_profile_manager_time_current

uint64

Время выполнения запроса в СУБД, миллисекунды

e1c_session_profile_dbms_time_current

uint64

Время выполнения запросов в СУБД на сеанс, миллисекунды

e1c_session_profile_dbms_time_total

uint64

Время последнего серверного вызова, миллисекунды

e1c_session_profile_server_time_current

uint64

Длительность серверного вызова на сеанс, миллисекунды

e1c_session_profile_server_time_total

uint64

Количество вызовов сервера за сеанс

e1c_session_profile_calls_total

uint64

Количество записанных данных в файлы за сеанс, байт

e1c_session_profile_write_bytes_total

uint64

Количество записанных данных, текущее, байт

e1c_session_profile_write_bytes_current

uint64

Количество прочитанных данных из файлов за сеанс, байт

e1c_session_profile_read_bytes_total

uint64

Количество прочитанных данных, текущее, байт

e1c_session_profile_read_bytes_current

uint64

Объем информации переданный/принятый СУБД за сеанс, байт

e1c_session_profile_dbms_bytes_total

uint64

Объем памяти, занятой за сеанс, байт

e1c_session_profile_memory_bytes_total

int64

Объем памяти, текущее, байт

e1c_session_profile_memory_bytes_current

int64

Процессорное время за сеанс, миллисекунды

e1c_session_profile_cpu_time_total

uint64

Процессорное время, текущее, миллисекунды

e1c_session_profile_cpu_time_current

uint64

Текущий объем информации переданный/принятый СУБД, байт

e1c_session_profile_dbms_bytes_current

uint64

Метрики сопровождаются следующими метками:

Метка

Описание

client_app

Тип клиентского приложения

client_host

Имя хоста клиентского приложения

client_ip

IP-адрес клиента

cluster

Идентификатор кластера

infobase

Идентификатор информационной базы

infobase_name

Наименование информационной базы в кластере

profile

Имя профиля безопасности

session

Идентификатор сессии

session_number

Номер сессии

user

Имя аутентифицированного пользователя сессии

6.4.3.4. Метрики информационной базы кластера

Перечень метрик:

Описание

Имя метрики

Тип

Общее количество сеансов информационной базы *

e1c_infobase_session_count

uint32

Количество активных (не "спящих") сеансов информационной базы *

e1c_infobase_active_session_count

uint32

Количество «спящих» сеансов информационной базы

e1c_infobase_hibernated_session_count

uint32

Метрики сопровождаются следующими метками:

Метка

Описание

cluster

Идентификатор кластера

infobase *

Идентификатор информационной базы

infobase_name *

Наименование информационной базы в кластере

Если получение метрик информационной базы выполняется из автономного сервера, то состав метрик и меток, доступных для использования, отмечены в таблицах этого раздела символом "*".

6.4.3.5. Метрики сервиса кластера

Перечень метрик:

Описание

Имя метрики

Тип

Количество менеджеров, на которые назначен сервис

e1c_service_manager_count

uint32

Метрики сопровождаются следующими метками:

Метка

Описание

cluster

Идентификатор кластера

service

Имя сервиса кластера

6.4.3.6. Метрики рабочего сервера кластера

Перечень метрик:

Описание

Имя метрики

Тип

Количество рабочих процессов на сервере

e1c_server_process_count

uint32

Количество активных рабочих процессов на сервере

e1c_server_active_process_count

uint32

Количество пассивных рабочих процессов на сервере

e1c_server_passive_process_count

uint32

Количество рабочих процессов на сервере, находящихся в состоянии ошибки

e1c_server_error_process_count

uint32

Суммарное количество активных сеансов всех рабочих процессов кластера на этом рабочем сервере

e1c_server_active_session_count

uint32

Количество менеджеров кластера

e1c_server_manager_count

uint32

Метрики сопровождаются следующими метками:

Метка

Описание

cluster

Идентификатор кластера

host

Имя компьютера (хоста), на котором работает рабочий сервер

server

Идентификатор рабочего сервера кластера

6.4.3.7. Метрики менеджера кластера

Перечень метрик:

Описание

Имя метрики

Тип

Количество сервисов, назначенных менеджеру

e1c_manager_service_count

uint32

Метрики сопровождаются следующими метками:

Метка

Описание

cluster

Идентификатор кластера

host

Имя компьютера (хоста), на котором работает рабочий сервер

manager

Идентификатор менеджера кластера

server

Идентификатор рабочего сервера кластера

6.4.3.8. Метрики рабочего процесса кластера

Перечень метрик:

Описание

Имя метрики

Тип

Средняя протяженность вызова сервера 1С:Предприятия, секунды

e1c_process_avg_call_time

double

...на сервер 1С:Предприятия, секунды

e1c_process_avg_server_call_time

double

...на SQL-сервер, секунды

e1c_process_avg_db_call_time

double

...на обратные вызовы, секунды

e1c_process_avg_back_call_time

double

...на обращения к менеджеру блокировок, секунды

e1c_process_avg_other_call_time

double

Среднее количество потоков, находящихся на сервере

e1c_process_avg_threads

double

Среднее время ожидания управляемой блокировки, секунды

e1c_process_avg_lock_time

double

Объем занятой виртуальной памяти процесса, байт

e1c_process_memory_size

uint64

Среднее время реакции на эталонный вызов, секунды

e1c_process_avg_response_time

uint32

Количество активных соединений процесса

e1c_process_connections

uint32

Средняя за последние 5 минут доступная производительность

e1c_process_available_perfomance

double

Количество активных сеансов рабочего процесса, т.е. тех сеансов, для которых рабочий процесс в данный момент исполняет вызовы сервера

e1c_process_active_session_count

Uint32

Состояние процесса:

● -1 ‑ ошибка,

● 0 ‑ пассивный,

● 1 ‑ активный.

e1c_process_state

uint32

Метрики сопровождаются следующими метками:

Метка

Описание

cluster

Идентификатор кластера

host

Имя компьютера (хоста), на котором работает рабочий сервер

pid

Идентификатор процесса ОС

process

Идентификатор рабочего процесса в кластере

server

Идентификатор рабочего сервера кластера

status

Состояние рабочего процесса:

on ‑ включен,

off ‑ выключен,

reserved ‑ зарезервирован.

6.4.4. Примеры получения метрик производительности

Действия, которые необходимо выполнить для получения метрик производительности, можно представить следующим образом:

1. Для кластера серверов:

1. Запустить кластер серверов в котором существует информационная база.

2. Запустить одно или несколько клиентских приложений, использующих эту информационную базу.

3. Запустить сервер администрирования с указанием на необходимость получения метрик производительности: ras cluster --monitor-base=/monitor.

2. Для автономного сервера:

1. Запустить автономный сервер так, чтобы в командной строке запуска присутствовал параметр управления механизмом мониторинга, например так: ibsrv … --monitor-base=/monitor.

3. Выполнить примеры команд получения различных метрик производительности:

1. Перейти по адресу: http://localhost:1555/monitor.

1. Для кластера серверов будут получены показатели:

1. По рабочим серверам.

2. По менеджерам кластера.

3. По рабочим процессам.

4. По информационным базам.

2. Для автономного сервера будут получены показатели:

1. По информационной базе.

2. Перейти по адресу: http://localhost:1555/monitor?sessions=1.

1. Для кластера серверов будут получены показатели:

1. По рабочим серверам.

2. По менеджерам кластера.

3. По рабочим процессам.

4. По информационным базам.

5. По сеансам запущенных приложений.

2. Для автономного сервера будут получены показатели:

1. По информационной базе.

2. По сеансам запущенных приложений.

3. Перейти по адресу: http://localhost:1555/monitor?sessions=1&filter=*total*.

1. Будут получены показатели, которые содержат с своем имени слово total.